import { Ref } from 'vue';

interface IUtils {
  /**
   * 判断两个对象是否相等
   * @param obj1 对象1
   * @param obj2 对象2
   * @returns {boolean} - true: 对象相等，false: 对象不相等
   */
  objCompare: (obj1: object, obj2: object) => boolean;

  /**
   * 去除字符串中的元素标记
   * @param fragment 带元素标记字符串
   */
  removeTag: (fragment: string) => string;

  /**
   * 复制文本到剪贴板
   * @param text
   */
  copyToClipboard: (text: string) => Promise<void>;

  /**
   * 获取指定范围的随机数
   * @param min 最小值
   * @param max 最大值
   */
  getRandomNumber: (min: number, max: number) => number;

  /**
   * 单例模式
   */
  singleton(className: new (...args: any[]) => Object): Object;

  /**
   * 防抖函数
   * @param {Function} fun
   * @param {number} duration - 延迟执行的时间/毫秒
   * @return {Function}
   * */
  debounce: (fn: Function, delay: number) => Function;

  /**
   * 节流函数
   * @param {Function} fun
   * @param {number} duration - 执行的时间/毫秒
   * @return {Function}
   * */
  throttle: (fn: Function, delay: number) => Function;

  /**
   * 深拷贝
   * @param obj 目标对象
   * @returns 拷贝对象
   */
  deepCopy: (obj: any) => any;

  /**
   * 防抖Ref
   * @param value - 值
   * @param duration - 延迟执行时间
   * @returns
   */
  debounceRef<T>(value: T, duration: number): Ref<T>;

  /**
   * 生成32位UUID
   */
  generateUuid32: () => string;

  /**
   * 检查指定字段状态是否变化
   * @param oldData  旧数据
   * @param newData  新数据
   * @param statusProperties 需要检查的状态属性
   */
  hasStatusChanged: (
    oldData: any,
    newData: any,
    statusProperties: string[]
  ) => boolean;
}

export type { IUtils };
